package com.example.weatherforecast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.PopupMenu;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;

import com.example.weatherforecast.city_manager.CityManagerActivity;
import com.example.weatherforecast.city_manager.SearchCityActivity;
import com.example.weatherforecast.database.MyDataBaseManager;
import com.example.weatherforecast.service.UpdateTimeService;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener, PopupMenu.OnMenuItemClickListener {

    //声明控件
    TextView timeTv;    //时间
    ImageView addCityIv, moreIv; // 添加，更多
    LinearLayout pointLayout;   // ViewPager指示器
    RelativeLayout mainLayout;    //主界面布局
    ViewPager mainVp;           // 主界面中的主要控件


    // ViewPager的数据源
    List<Fragment> fragmentList;

    // 表示选中的城市的集合
    List<String> cityList;

    // 表示ViewPager的页数指数器显示集合
    List<ImageView> imgList;
    // 存放壁纸
    SharedPreferences pref;
    int bgNum;
    // Fragment适配器
    private CityFragmentPaperAdapter adapter;
    // 广播者
    private MyTimeBroadcast mTimeBroadcast;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
        startTimeService();
    }

    /**
     * 启动服务
     */
    private void startTimeService() {
        Intent timeService = new Intent(this, UpdateTimeService.class);
        startService(timeService);
    }

    /**
     * 重新加载页面时执行该方法
     * 进行ViewPager更新
     */
    @Override
    protected void onRestart() {
        super.onRestart();
        // 获取数据库当中还剩下的城市集合
        List<String> list = MyDataBaseManager.queryAllCityName();
        if (list.size() == 0) {
            list.add("北京");
        }
        //重写加载之前，清空原本数据源
        cityList.clear();
        cityList.addAll(list);

        // 逆序
        Collections.reverse(cityList);

        // 剩余城市也要创建对应的fragment页面
        fragmentList.clear();
        //重新加载fragment页面
        initPager();
        //提醒适配器页面数量发生改变
        adapter.notifyDataSetChanged();
        //页面数量发生改变，指示器的数量也会发生变化，重写设置添加指示器
        imgList.clear();
        //将布局当中所有元素全部移除
        pointLayout.removeAllViews();
        initPoint();
        //展示最新城市页面
        mainVp.setCurrentItem(0);
    }


    /**
     * 获取焦点后跳转对应页数
     */
    @Override
    protected void onResume() {
        super.onResume();
        // 跳转对应页，默认是最新添加的城市
        Intent intent = getIntent();
        String city = intent.getStringExtra("city");
        if (cityList.contains(city)) {
            mainVp.setCurrentItem(cityList.indexOf(city));
        } else {
            mainVp.setCurrentItem(getIntent().getIntExtra("page", 0));
        }

    }


    /**
     * 销毁后停止更新时间服务
     */
    @Override
    protected void onDestroy() {
        //停止更新时间服务
        stopService(new Intent(MainActivity.this, UpdateTimeService.class));
        super.onDestroy();
    }

    /**
     * 初始化控件
     */
    void init() {

        timeTv = findViewById(R.id.mainTime);
        mainLayout = findViewById(R.id.mainLayout);
        addCityIv = findViewById(R.id.mainIvAdd);
        moreIv = findViewById(R.id.mainIvMore);
        pointLayout = findViewById(R.id.mainPoint);
        mainVp = findViewById(R.id.mainVp);

        // 更换壁纸
        exchangeBg();

        // 添加点击事件
        addCityIv.setOnClickListener(this);
        moreIv.setOnClickListener(this);

        // 初始化fragmentList、cityList和imgList
        fragmentList = new ArrayList<>();
        imgList = new ArrayList<>();
//        MyDataBaseManager.initDB(this);
        cityList = MyDataBaseManager.queryAllCityName();

        // 默认城市为东莞
        if (cityList.size() == 0) {
            cityList.add("东莞");
//            cityList.add("北京");
//            cityList.add("广州");
//            cityList.add("哈尔滨");
//            cityList.add("深圳");
//            cityList.add("厦门");
        }

        // 从搜索界面跳转到主界面
        // 获取传递信息
        Intent intent = getIntent();
        String city = intent.getStringExtra("city");
        // 判断
        if (!cityList.contains(city) && !TextUtils.isEmpty(city)) {
            cityList.add(city);
        }

        // 逆序，将最新的城市放在第一个
        Collections.reverse(cityList);
        // 初始化ViewPager页面
        initPager();
        adapter = new CityFragmentPaperAdapter(getSupportFragmentManager(), fragmentList);
        // 给ViewPager设置适配器
        mainVp.setAdapter(adapter);

        // 创建小圆点指示器
        initPoint();

        setPagerListener();

        mTimeBroadcast = new MyTimeBroadcast();
        // 过滤出系统发送的时间改变的广播
        IntentFilter filter1 = new IntentFilter();
        filter1.addAction("TIME_CHANGED_ACTION");
        // 注册广播
        registerReceiver(mTimeBroadcast, filter1);
        // 第一次启动先更新时间
        updateTime();
    }

    /**
     * 设置圆点指示器监听事件，随着ViewPager换页而移动
     */
    private void setPagerListener() {
        mainVp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            /**
             * 滑动ViewPager页面时更新圆点指示器
             * @param position 页数
             */
            @Override
            public void onPageSelected(int position) {
                for (int i = 0; i < imgList.size(); i++) {
                    imgList.get(i).setImageResource(R.mipmap.a1);
                }
                imgList.get(position).setImageResource(R.mipmap.a2);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }

    /**
     * 根据ViewPager页数创建小圆点
     */
    private void initPoint() {
        for (int i = 0; i < fragmentList.size(); i++) {
            ImageView pIv = new ImageView(this);
            pIv.setImageResource(R.mipmap.a1);
            pIv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) pIv.getLayoutParams();
            lp.setMargins(0, 0, 20, 0);
            imgList.add(pIv);
            pointLayout.addView(pIv);
        }
        //imgList.get(imgList.size()-1).setImageResource(R.mipmap.a2);
        imgList.get(0).setImageResource(R.mipmap.a2);

    }

    /**
     * 初始化ViewPager页面
     */
    private void initPager() {
        // 创建Fragment对象，添加到ViewPager数据源当中
        for (int i = 0; i < cityList.size(); i++) {
            CityWeatherFragment cwFrag = new CityWeatherFragment();
            Bundle bundle = new Bundle();
            bundle.putString("city", cityList.get(i));
            cwFrag.setArguments(bundle);
            fragmentList.add(cwFrag);
        }
    }

    /**
     * 点击事件
     *
     * @param v
     */
    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.mainIvAdd: //跳转到搜索界面
//                Toast.makeText(this, "点击添加按钮", Toast.LENGTH_SHORT).show();

                Intent intent;
                // 最多只能同时保存7个城市信息
                if (MyDataBaseManager.getCityCount() <= 7) {
                    intent = new Intent(this, SearchCityActivity.class);
                    startActivity(intent);
                } else {
                    Toast.makeText(this, "存储城市数量已达上限，请删除后再增加", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.mainIvMore:
                //创建弹出式菜单对象
                PopupMenu popup = new PopupMenu(this, v);
                //获取菜单填充器
                MenuInflater inflater = popup.getMenuInflater();
                //填充菜单
                inflater.inflate(R.menu.more_menu, popup.getMenu());
                //绑定菜单项的点击事件
                popup.setOnMenuItemClickListener(this);
                //显示
                popup.show();
                break;
        }
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        // TODO Auto-generated method stub
        Intent intent = new Intent();
        switch (item.getItemId()) {
            case R.id.cityManager://跳转到城市管理界面
                intent.setClass(this, CityManagerActivity.class);
                break;
            case R.id.moreSetting://跳转到更多设置界面
                intent.setClass(this, MoreActivity.class);
                break;
            default:
                break;
        }
        startActivity(intent);
        return false;
    }

    /**
     * 更换壁纸
     */
    public void exchangeBg() {
        pref = getSharedPreferences("bg_pref", MODE_PRIVATE);
        bgNum = pref.getInt("bg", 0);
        switch (bgNum) {
            case 0:
                mainLayout.setBackgroundResource(R.mipmap.bg);
                break;
            case 1:
                mainLayout.setBackgroundResource(R.mipmap.bg2);
                break;
            case 2:
                mainLayout.setBackgroundResource(R.mipmap.bg3);
                break;
        }
    }

    /**
     * 更新时间
     */
    void updateTime() {
        // 获取时间
        Date date = new Date();
        // 格式化时间
        SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
        String time = timeFormat.format(date);
        // 显示时间
        timeTv.setText(time);
    }

    /**
     * 广播接收者
     */
    public class MyTimeBroadcast extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            updateTime();//更新时间的操作
        }
    }
}

